//
// Created by Yandel on 2024/11/30.
//
#include <stdbool.h>
#include <malloc.h>
#include "stdio.h"
typedef int Element;

typedef struct DuLNode{
    Element data;
    struct DuLNode *prior,*next;
} DNode;

/**
 * 初始化链表
 * @param duLNode
 */
void InitList(DNode *node)
{
    //初始化头结点指向null
    node->next=node->prior=NULL;
}

/**
 * 插入
 * @param dNode
 * @param element
 * @param index
 * @return
 */
//bool InsertNode(DNode *dNode,Element element,int index)
//{
//    if(index < 1) return false;
//
//    //找到第index个位置
//    int count=0;
//    while (dNode->next!=NULL && count<index-1){
//        dNode=dNode->next;
//        count++;
//    }
//
//    //新生成一个结点
//   DNode  *newNode=(DNode*) malloc(sizeof (DNode));
//    if(!newNode) return false;
//    newNode->data=element;
//    //这四个顺序很重要
//    newNode->prior=dNode->prior;
//    dNode->prior->next=newNode;
//    newNode->next= dNode;
//    dNode->prior=newNode;
//
//    return true;
//}
bool InsertNode(DNode *dNode, Element element, int index) {
    if (index < 1 || !dNode) return false;

    // 找到第 index 个位置的前驱节点
    int count = 0;
    while (dNode->next != NULL && count < index - 1) {
        dNode = dNode->next;
        count++;
    }

    // 如果插入位置大于链表长度，返回 false
    if (count < index - 1) return false;

    // 新生成一个节点
    DNode *newNode = (DNode *)malloc(sizeof(DNode));
    if (!newNode) return false;

    newNode->data = element; // 初始化节点数据

    // 插入到链表中（处理边界条件）
    if (dNode->next == NULL && count == index - 1) {
        // 尾部插入
        newNode->next = NULL;
        newNode->prior = dNode;
        dNode->next = newNode;
    } else {
        // 中间插入
        newNode->next = dNode->next;
        if (dNode->next != NULL) {
            dNode->next->prior = newNode;
        }
        newNode->prior = dNode;
        dNode->next = newNode;
    }

    return true;
}

/**
 * 按下标删除结点
 * @param dNode
 * @param index
 * @return
 */
//Element DeleteNode(DNode *dNode,int index)
//{
//    //表中没有元素可以删除
//    if(index <1) return false;
//    //寻找待删除结点的下标
//    int count=0;
//    while(dNode->next!=NULL && count<index-1){
//        dNode=dNode->next;
//        count++;
//    }
//    DNode *p=dNode->data;
//    //开始删除结点
//    dNode->prior->next=dNode->next;
//    dNode->next->prior=dNode->prior;
//    free()
//    return true;
//}

Element DeleteNode(DNode *dNode, int index) {
    // 检查输入有效性
    if (index < 1 || dNode == NULL) return 0; // 返回 0 或约定的错误值

    // 找到第 index 个节点
    int count = 0; // 从第1个节点开始计数[count 记录待查结点的下标]
    while (dNode != NULL && count < index) {
        dNode = dNode->next;
        count++;
    }

    // 如果未找到第 index 个节点
    if (dNode == NULL) return 0;

    // 保存待删除节点的数据
    Element deletedData = dNode->data;

    // 删除节点
    if (dNode->prior != NULL) {
        dNode->prior->next = dNode->next;
    }
    if (dNode->next != NULL) {
        dNode->next->prior = dNode->prior;
    }

    // 释放内存
    free(dNode);

    return deletedData; // 返回删除的节点数据
}


/**
 * 按位置查找结点值
 * @param dNode
 * @param index  第几位置
 * @return
 */
Element GetElementByIndex(DNode *dNode,int index)
{
    //查找位置不合理
    if(index <=0 || dNode == NULL) return 0;
    int count=0;
    while (dNode->next && count<index){
        dNode=dNode->next;
        count++;
    }
    //如果超出长度返回-1
    if(count >index) return -1;
    return dNode->data;
}


/**
 * 打印链表
 * @param dNode
 */
void printNodeList(DNode *dNode)
{
    while (dNode->next){
        dNode=dNode->next;
        printf("%d ",dNode->data);
    }
    printf("\n");
}

int main(){
    DNode  dNode;

    InitList(&dNode);

    InsertNode(&dNode,12,1);
    InsertNode(&dNode,122,1);
    InsertNode(&dNode,132,1);
    InsertNode(&dNode,125,1);
    InsertNode(&dNode,212,1);
    InsertNode(&dNode,222,1);


    printNodeList(&dNode);

    printf("%d \n",GetElementByIndex(&dNode,4));


    printf("%d \n",DeleteNode(&dNode,6)) ;


    printNodeList(&dNode);

    return  0;
}
